package com.seuic.hnapps.util;

import com.orhanobut.logger.Logger;
import com.seuic.hnapps.bean.CardBinInfo_bean;
import com.solab.enc.DES3;
import com.solab.enc.HexT;
import com.solab.enc.SMS4;
import com.solab.iso8583.IsoMessage;
import com.solab.iso8583.IsoType;

import java.util.List;

/**
 * 密码解锁
 */
public class TPUInstall {
    public IsoMessage packRequest(String transn, String bindNum, String passWord,
                                  List<CardBinInfo_bean> beans, String CardType, String track2Data,
                                  String id_type, String id_num, String s_number,String f55,String user_num,String run_time) {
        IsoMessage msg = new IsoMessage();
        String encflag = Constants.YANTAI_ENCFLG2;
        msg.setType(0x0200);
        msg.setHeadValue(1, String.valueOf(Constants.ATMP_HEADER_LENGTH), IsoType.BCD, 2);
        msg.setHeadValue(2, Constants.YANTAI_PACKVS, IsoType.ALPHA, 2);
        msg.setHeadValue(3, Constants.YANTAI_TERMVS, IsoType.ALPHA, 8);
        msg.setHeadValue(4, encflag, IsoType.ALPHA, 1); // 加密标志：业务交易，公网传输1-报文加密，专线传输2-磁道加密
        msg.setHeadValue(5, Constants.YANTAI_BANKID, IsoType.ALPHA, 8);
        msg.setHeadValue(6, Constants.YANTAI_TERMNO, IsoType.ALPHA, 8);
        msg.setHeadValue(7, "0000", IsoType.ALPHA, 4); // 8583域部分长度，组包时动态填充

        //****************传卡号****************
        msg.setValue(2, bindNum, IsoType.LLVAR, 19);
        msg.setValue(3, "560000", IsoType.ALPHA, 6);
        msg.setValue(7, run_time, IsoType.ALPHA, 10);
        msg.setValue(8, Constants.YANTAI_CHANLENO, IsoType.ALPHA, 2);
        msg.setValue(11, transn, IsoType.ALPHA, 6);
        // 根据读取到的卡BIN，判断是否为贷记卡
        for (int i = 0; i < beans.size(); i++) {
            if (beans.get(i).getCardtype() == 2 || beans.get(i).getCardtype() == 3) {
                if (beans.get(i).getCardbind().equals(bindNum.substring(0, beans.get(i).getBinlen()))) {
//             贷记卡需要上送卡有效期
//            **************** 传二磁信息*****************
                    String epdate = track2Data.split("=")[1].substring(0, 4);
                    msg.setValue(14, epdate, IsoType.ALPHA, 4);
                }
            }
        }
        msg.setValue(20, "01100000", IsoType.ALPHA, 8);
        // 第22域，需要严格按照规范填写 手工输入01 磁条读取02 IC卡 05 第三位是否有密码1 无密码2
        String f22 = "";
        if (CardType.equals("MAG Card")) {
            f22 = "02";
        } else if (CardType.equals("IC Card")) {
            f22 = "05";
        } else {
            f22 = "01";
        }
        msg.setValue(22, f22 + 1, IsoType.ALPHA, 3);

        Logger.e(s_number + "s_number");
        if (CardType.equals("IC Card")) {// 判断是否是ic卡
            if (s_number.length() == 3) {
                msg.setValue(23, s_number, IsoType.ALPHA, 3);// 按照实际读取值填写
            } else if (s_number.length() == 2) {
                msg.setValue(23, "0" + s_number, IsoType.ALPHA, 3);// 按照实际读取值填写
            }
        }
        // 第35，二磁信息，磁条卡交易时上送；判断是否需要加密
//        if (CardType.equals("MAG Card")) {
//            if ("2".equals(encflag)) {
//                //**************** 传二磁信息*****************
//                if (track2Data.length() < 33) { // 小于33位不加密
//                    msg.setValue(35, track2Data, IsoType.LLVAR, 37);
//                } else {
//                    //**************** 密码键盘获取tdk秘钥*****************
//                    com.orhanobut.logger.Logger.e(Constants.YANTAI_TDKKEY);
//                    String tdk = Constants.YANTAI_TDKKEY;
////                    **************** 传二磁信息*****************
//                    String enctrack2 = DES3.doTrack2(track2Data, tdk.getBytes(), 0);//0-加密 1-解密
//                    msg.setValue(35, enctrack2, IsoType.LLVAR, 37);
//                }
//            } else {
////                **************** 传二磁信息*****************
//                msg.setValue(35, track2Data, IsoType.LLVAR, 37);
//            }
//
//            // 第36，三磁信息，有则上送；不需加密
//            //**************** 传三磁信息*****************
//
//        }
//        if(msg.getStringValue(22).startsWith("02")){// 第22域前2位02表示读取磁条
            if("2".equals(encflag)){
                if(track2Data.length()<33){ // 小于33位不加密
                    msg.setValue(35, track2Data, IsoType.LLVAR, 37);
                }else{
                    String tdk1 = Constants.YANTAI_TDKKEY;
                    String enctrack23 = DES3.doTrack2(track2Data, tdk1.getBytes(), 0);//0-加密 1-解密
                    msg.setValue(35, enctrack23, IsoType.LLVAR, 37);
                }
            }else if("4".equals(encflag)){
                if(track2Data.length()<33){ // 小于33位不加密
                    msg.setValue(35, track2Data, IsoType.LLVAR, 37);
                }else{
                    String tdk3 = Constants.YANTAI_TDKKEY;
                    String enctrack24 = SMS4.doTrack2(track2Data, tdk3, 0);//0-加密 1-解密
                    msg.setValue(35, enctrack24, IsoType.LLVAR, 37);
                }
            }
            else{
                msg.setValue(35, track2Data, IsoType.LLVAR, 37);
            }
//        }

//        com.orhanobut.logger.Logger.e(Constants.YANTAI_TDKKEY);
//        String tdk = Constants.YANTAI_TDKKEY;
////                    **************** 传二磁信息*****************
//        String enctrack2 = DES3.doTrack2(track2Data, tdk.getBytes(), 0);//0-加密 1-解密
//        msg.setValue(35, enctrack2, IsoType.LLVAR, 37);
        if(msg.getStringValue(22).startsWith("02")){// 第22域前2位02表示读取磁条
            if("2".equals(encflag)){
                if(track2Data.length()<33){ // 小于33位不加密
                    msg.setValue(35, track2Data, IsoType.LLVAR, 37);
                }else{
                    String tdk1 = Constants.YANTAI_TDKKEY;
                    String enctrack23 = DES3.doTrack2(track2Data, tdk1.getBytes(), 0);//0-加密 1-解密
                    msg.setValue(35, enctrack23, IsoType.LLVAR, 37);
                }
            }else if("4".equals(encflag)){
                if(track2Data.length()<33){ // 小于33位不加密
                    msg.setValue(35, track2Data, IsoType.LLVAR, 37);
                }else{
                    String tdk3 = Constants.YANTAI_TDKKEY;
                    String enctrack24 = SMS4.doTrack2(track2Data, tdk3, 0);//0-加密 1-解密
                    msg.setValue(35, enctrack24, IsoType.LLVAR, 37);
                }
            }
            else{
                msg.setValue(35, track2Data, IsoType.LLVAR, 37);
            }
        }
        msg.setValue(41, Constants.YANTAI_TERMNO, IsoType.ALPHA, 8);
        // 第49域，币种
        msg.setValue(49, "156", IsoType.ALPHA, 3);
        // 密码
        if (msg.getStringValue(22).endsWith("1")) {// 第22域前3位1表示有密码
            //**************** 密码键盘获取pin秘钥*****************
            com.orhanobut.logger.Logger.e(Constants.YANTAI_PINKEY);
            String pinkey = Constants.YANTAI_PINKEY;
            //**************** 传卡号，密码*****************
            Logger.e(bindNum);
            String pinblock;

//            msg.setValue(52, pinblock, IsoType.HEXBIN, 8);
            if (Constants.isSM) {
                byte[] pkey = HexT.hexstr2ByteArr(pinkey);
                msg.setValue(52, "0000000000000000", IsoType.HEXBIN, 8);

                pinblock = SMS4.sm4PinBlock_98(bindNum, passWord, pkey);
                StringBuffer f63 = new StringBuffer();
                f63.append("SM");
                f63.append("032");
                f63.append(pinblock);
                msg.setValue(63, f63.toString(), IsoType.LLLVAR, 37);

            } else {
                pinblock = DES3.getPinBlock_98(bindNum, passWord, pinkey.getBytes());
                msg.setValue(52, pinblock, IsoType.HEXBIN, 8);
            }
        }
        if (Constants.isSM) {
            msg.setValue(53, Constants.DEMO_F53, IsoType.ALPHA, 16);
        }
        if (CardType.equals("IC Card")) {
            Logger.e("传卡55域芯片信息");
            //**************** 传卡55域芯片信息*****************
            msg.setValue(55, f55, IsoType.LLLHEXBIN, 255);// 按照实际读取值填写，
        }

        // 第57域，终端各部件状态，按实际填写
        msg.setValue(57, Constants.YANTAI_F57, IsoType.LLLVAR, 127);
        // 第60域，按实际填写
        msg.setValue(60, Constants.YANTAI_BATCHNO + "6" + "0", IsoType.LLVAR, 30);

        String f122_null = "";
        if (id_num.length() == 10) {
            f122_null = "          ";
        } else if (id_num.length() == 11) {
            f122_null = "         ";
        } else if (id_num.length() == 12) {
            f122_null = "        ";
        } else if (id_num.length() == 13) {
            f122_null = "       ";
        } else if (id_num.length() == 14) {
            f122_null = "      ";
        } else if (id_num.length() == 15) {
            f122_null = "     ";
        } else if (id_num.length() == 16) {
            f122_null = "    ";
        } else if (id_num.length() == 17) {
            f122_null = "   ";
        } else if (id_num.length() == 18) {
            f122_null = "  ";
        } else if (id_num.length() == 19) {
            f122_null = " ";
        } else if (id_num.length() == 20) {
            f122_null = "";
        }

        String f122s =user_num+ "                  " + id_type + id_num + f122_null;
        String f122 = "JW0" + f122s.length() + f122s;
        msg.setValue(122, f122, IsoType.LLLVAR, 30);
        // MAC，填写8字节，则需要生成MAC，外层统一处理；本域不填写，则外层不会生成
        msg.setValue(128, "00000000", IsoType.ALPHA, 8);

        return msg;
    }

}
